<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>s08-事件处理</title>
		<script src="../vue.js"></script>
	</head>
	<body>
		<!-- 1 监听事件 -->
		<div id="app1">
			<button v-on:click="counter += 1">add 1</button>
			<p>The button above has been clicked {{ counter }} times.</p>
		</div>
		<hr />
		<!-- 2 事件处理方法 -->
		<div id="app2">
			<!-- `greet` 是在下面定义的方法名 -->
			<button @click="greet">greet</button>
		</div>
		<hr />
		<!-- 3 内联处理器中的方法 -->
		<div id="app3">
			<button @click="say('hi')">say hi</button>
			<button @click="say('what')">say what</button>
		</div>
		<hr />
		<!--   3.1 有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法： -->
		<div id="app4">
			<button @click="warn('Form cannot be submitted yet.', $event)">submit</button>
		</div>
		<hr />
		
		<!-- 4 事件修饰符 -->
		<!-- 阻止单击事件继续传播 -->
		<a v-on:click.stop="doThis"></a>
		
		<!-- 提交事件不再重载页面 -->
		<form v-on:submit.prevent="onSubmit"></form>
		
		<!-- 修饰符可以串联 -->
		<a v-on:click.stop.prevent="doThat"></a>
		
		<!-- 只有修饰符 -->
		<form v-on:submit.prevent></form>
		
		<!-- 添加事件监听器时使用事件捕获模式 -->
		<!-- 即内部元素触发的事件先在此处理，然后才交由内部元素进行处理 -->
		<div v-on:click.capture="doThis">...</div>
		
		<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
		<!-- 即事件不是从内部元素触发的 -->
		<div v-on:click.self="doThat">...</div>
		
		<!-- 点击事件将只会触发一次（2.1.4 新增） -->
		<a v-on:click.once="doThis"></a>
		<!-- Vue 还对应 addEventListener 中的 passive 选项提供了 .passive 修饰符（2.3.0 新增） -->
		<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
		<!-- 而不会等待 `onScroll` 完成  -->
		<!-- 这其中包含 `event.preventDefault()` 的情况 -->
		<div v-on:scroll.passive="onScroll">...</div>
		
		<!-- 5 按键修饰符 -->
		<!--   只有在 `key` 是 `Enter` 时调用 `vm.submit()` -->
		<input v-on:keyup.enter="submit">
		<!--   处理函数只会在 $event.key 等于 PageDown 时被调用 -->
		<input v-on:keyup.page-down="onPageDown">

		<!--   5.1 按键码 -->
		<!-- keyCode 的事件用法已经被废弃了并可能不会被最新的浏览器支持。使用 keyCode attribute 也是允许的： -->
		<input v-on:keyup.13="submit">
		<!-- 为了在必要的情况下支持旧浏览器，Vue 提供了绝大多数常用的按键码的别名：
		 .enter
		 .tab
		 .delete (捕获“删除”和“退格”键)
		 .esc
		 .space
		 .up
		 .down
		 .left
		 .right
		 
		 有一些按键 (.esc 以及所有的方向键) 在 IE9 中有不同的 key 值, 如果你想支持 IE9，这些内置的别名应该是首选。
		 -->
		 
		 <!-- 你还可以通过全局 config.keyCodes 对象自定义按键修饰符别名：
		  // 可以使用 `v-on:keyup.f1`
		  Vue.config.keyCodes.f1 = 112
		  -->
		 
		<!-- 6 系统修饰键 -->
		<!-- 
		2.1.0 新增
		可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器。
		.ctrl
		.alt
		.shift
		.meta
		 -->
		 <!-- Alt + C -->
		 <input v-on:keyup.alt.67="clear">
		 
		 <!-- Ctrl + Click -->
		 <div v-on:click.ctrl="doSomething">Do something</div>
		<!-- 请注意修饰键与常规按键不同，在和 keyup 事件一起用时，事件触发时修饰键必须处于按下状态。
		换句话说，只有在按住 ctrl 的情况下释放其它按键，才能触发 keyup.ctrl。而单单释放 ctrl 也不会触发事件。
		如果你想要这样的行为，请为 ctrl 换用 keyCode：keyup.17。
		 -->
		 
		<!--   6.1 .exact 修饰符 -->
		<!-- .exact 修饰符允许你控制由精确的系统修饰符组合触发的事件。（2.5.0 新增） -->
		<!-- 即使 Alt 或 Shift 被一同按下时也会触发 -->
		<button v-on:click.ctrl="onClick">A</button>

		<!-- 有且只有 Ctrl 被按下的时候才触发 -->
		<button v-on:click.ctrl.exact="onCtrlClick">A</button>

		<!-- 没有任何系统修饰符被按下的时候才触发 -->
		<button v-on:click.exact="onClick">A</button>

		
		<!--   6.2 鼠标按钮修饰符 -->
		<!-- 
		2.2.0 新增
		.left
		.right
		.middle
		这些修饰符会限制处理函数仅响应特定的鼠标按钮。
		 -->
		 
		
		<script type="text/javascript">
			// 1 监听事件
			new Vue({
				el: '#app1',
				data: {counter: 0}
			})
			// 2 事件处理方法
			var vm2 = new Vue({
				el: '#app2',
				data: { name: 'Vue.js' },
				methods: {
					greet: function(event) {
						// `this` 在方法里指向当前 Vue 实例
						alert('Hello ' + this.name + '!')
						// `event` 是原生 DOM 事件
						if (event) {
							alert(event.target.tagName)
						}
					}
				}
			})
			// vm2.greet() // => 'Hello Vue.js!'
			
			// 3 内联处理器中的方法
			new Vue({
				el: '#app3',
				methods: {
					say: function(message) {
						alert(message)
					}
				}
			})
			//   有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法：
			new Vue({
				el: '#app4',
				methods: {
					warn: function(message, event) {
						// 现在我们可以访问原生事件对象
						if (event) {
							event.preventDefault()
						}
						alert(message)
					}
				}
			})

			// 4 事件修饰符
			// 5 按键修饰符
			//   5.1 按键码
			//     你还可以通过全局 config.keyCodes 对象自定义按键修饰符别名：
			 //    可以使用 `v-on:keyup.f1`
			 Vue.config.keyCodes.f1 = 112
			 
			// 6 系统修饰键
			//   6.1 .exact 修饰符
			//   6.2 鼠标按钮修饰符
			
			
		</script>
	</body>
</html>
